package com.ljx.proxyMode.dynamicProxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 *
 * CGLib动态代理
 *
 * CGLIB是一个功能强大，高性能的代码生成包。它为没有实现接口的类提供代理，为JDK的动态代理提供了很好的补充
 *
 * @作者 LJX
 * @日期 2022/12/22 16:43
 */
public class CGLibDynamicProxyTest {

    public static void main(String[] args) {
        //客户买票
        CGLibProxyFactory cgLibProxyFactory = new CGLibProxyFactory();
        //调用代理工厂生成代理对象
        CGLibTrainStation cgLibTrainStation = cgLibProxyFactory.getCGLibTrainStation();
        cgLibTrainStation.sell();
    }

}

/**
 * 火车站（真实主题类）
 */
class CGLibTrainStation{

    public void sell() {
        System.out.println("火车站卖票");
    }
}

/**
 * 代理工厂
 */
class CGLibProxyFactory implements MethodInterceptor {

    private CGLibTrainStation cgLibTrainStation = new CGLibTrainStation();

    /**
     * 获取代理对象
     * @return
     */
    public CGLibTrainStation getCGLibTrainStation(){
        //创建Enhancer对象，类似于JDK代理中的Proxy类
        Enhancer eh = new Enhancer();
        //设置父类的字节码对象
        eh.setSuperclass(CGLibTrainStation.class);
        //设置回调函数
        eh.setCallback(this);
        //创建代理对象并返回
        return (CGLibTrainStation) eh.create();
    }


    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("代理点收取服务费（CGLib）");
        //调用目标对象的方法
        return method.invoke(cgLibTrainStation, objects);
    }
}

